﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<string.h>
#include "add.h"

//初使函数     库函数
/*int main()
{
	//double sqrt(double x);
	//sqrt 是函数名
	//x 是函数的参数，表⽰调⽤sqrt函数需要传递⼀个double类型的值
	//double 是返回值类型 - 表⽰函数计算的结果是double类型的值
	double r=sqrt(16);
	printf("%lf\n", r);
	return 0;
}*/

//自定义函数
//int Add(int x, int y)
//{
//	int z=x + y;
//	return z;//计算结果并返回
//}
//
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	int c = Add(a, b);//函数调用
//	printf("%d\n", c);
//	return 0;
//}


/*int Add(int x, int y)//形参，，在函数名 Add 后的括号中写的 x 和 y
                    // x和 y 只是形式上存在的，不会向内存申请空间，不会真实存在的，
{
	int z = 0;
	z = x + y;
	return z;
}
//形参和实参各⾃是独⽴的内存空间。
//x和y的地址、a和b的地址是不⼀样的，所以我们可以理解为形参是实参的⼀份临时拷⻉
int main()
{
	int a = 0;
	int b = 0;
	//输⼊
	scanf("%d %d", &a, &b);

	                   //调⽤加法函数，完成a和b的相加，求和的结果放在r中
	int r = Add(a, b);//实参，传递给函数的参数a和b，
	//输出
	printf("%d\n", r);
	return 0;
}*/

// 数组做函数参数
/*void set_arr(int arr[], int sz)//一维数组中[]中的数字可以省略，但二维数组不可以
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		arr[i] = -1;
	}
}
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n"); //函数的形式参数要和函数的实参个数匹配
		        //函数的实参是数组，形参也是可以写成数组形式的
		       //形参如果是⼀维数组，数组⼤⼩可以省略不写
		      //形参如果是⼆维数组，⾏可以省略，但是列不能省略
		     //数组传参，形参是不会创建新的数组的
		    //形参操作的数组和实参的数组是同⼀个数组
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	set_arr(arr, sz);//设置数组内容为-1
	print_arr(arr, sz);//打印数组内容
	return 0;
}*/


//函数嵌套
//练习 某年某月有几天
//int is_leap_year(int y)
//{
//	if (((y % 4 == 0) && (y % 100!= 0)) || (y % 400 == 0))
//		return 1;
//	else
//		return 0;
//}
//int get_days_of_month(int x, int y)
//{
//	int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//	int day = days[y];
//	if (is_leap_year(x) &&  y== 2)
//		day += 1;
//	return day; 
//}
//int main()
//{
//	int year = 0;
//	int month = 0;
//	scanf("%d%d", &year, &month);
//	int day = get_days_of_month(year, month);
//	printf("%d\n", day);
//	return 0;
//}


//链式访问:将⼀个函数的返回值作为另外⼀个函数的参数，+
//int main()
//{
//	printf("%d\n", strlen("abcdef"));//1.strlen求⼀个字符串的⻓度2.打印⻓度 
//	return 0;
//}

//int main()
//{
//	printf("%d", printf("%d", printf("%d", 43))); //printf函数返回的是打印在屏幕上的字符的个数。
//	return 0;//结果为4321
//}


//*************************************************************************************************+
//单个文件函数声明和定义 ---》函数先声明后定义
//int is_leap_year(int y);//函数声明
//int main()
//{
//	int y = 0;
//	scanf("%d", &y);
//	int r = is_leap_year(y);//函数调用
//	if (r == 1)
//		printf("闰年\n");
//	else
//		printf("⾮闰年\n");
//	return 0;
//}
//int is_leap_year(int y)//函数定义
//{
//	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
//		return 1;
//	else
//		return 0;
//}


//多文件
//int main()
//{//头文件添加include"add.h"
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	int c = Add(a, b);//函数调用
//	printf("%d\n", c);
//	return 0;
//}


//局部变量的作⽤域是变量所在的局部范围。
//全局变量的作⽤域是整个⼯程（项⽬）。
//局部变量的⽣命周期是：进⼊作⽤域变量创建，⽣命周期开始，出作⽤域⽣命周期结束。
//全局变量的⽣命周期是：整个程序的⽣命周期。

//static 修饰局部变量  修饰全局变量  修饰函数
//void test()
//{
//	int i = 0;
//	i++;
//	printf("%d ", i);
//}
//int main()
//{
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		test();
//	}
//	return 0;//结果是3 3 3 3 3
//}
//
//void test()
//{
//	static int i = 0;//static修饰局部变量：改变了变量的⽣命周期，⽣命周期改变的本质是改变了变量的存储类型
//	i++;            //但是作⽤域不变的。
//	printf("%d ", i);
//}
//int main()
//{
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		test();
//	}
//	return 0;//结果是3 4 5 6 7
//}

//static 修饰全局变量
//extern int g_val;//extern 是⽤来声明外部符号的
//int main()
//{-
//	printf("%d\n", g_val);//⼀个全局变量被static修饰，使得这个全局变量只能在本源⽂件内使⽤，
//	return 0;			//不能在其他源⽂件内使⽤。
//						//本质原因是全局变量默认是具有外部链接属性的，在外部的⽂件中想使⽤，
						// 只要适当的声明就可以使
//						//⽤；但是全局变量被 static 修饰之后，外部链接属性就变成了内部链接属性，
						// 只能在⾃⼰所在的源
//						//⽂件内部使⽤了，其他源⽂件，即使声明了，也是⽆法正常使⽤的
//}


//static 修饰函数
extern int Add(int x, int y);
int main()
{
	printf("%d\n", Add(2, 3));//static 修饰函数和 static 修饰全局变量是⼀模⼀样的，
	return 0;
}